\chapter{アドレスとルーティング}
PPPを利用して、リモートのネットワークとの接続を正しくおこなうためには、
アドレスとルーティングの指定について、PPPの動作モードとあわせて
理解しておくことが重要です。この章では、これらの事項についての説明を
します。

\section{IPアドレスの調停}\label{ip-address}
PPPではIPCPというプロトコルを利用することにより、接続相手との
あいだで双方が用いるIPアドレスを相談して決めることができます。
この相談は、以下のような手順を踏むことにより決定されます。
\begin{enumerate}
\item 双方は互いに、自分の側で使用したいIPアドレスを相手に
  伝えます。
\item 相手の主張するアドレスを使わせてもよければ、それを認めます。
\item 相手の主張が認められなければ、別のアドレスを使用することを
  提案します。
\item 自分の主張がとおらなくても、相手の提案を受け入れることが
  できれば、そのアドレスを使うことにします。
\item 相手の提案で折れることができなければ、自分の主張を繰り返します。
\item 上記の操作を何回か繰り返しても妥協することができなければ、
  接続をあきらめます。
\end{enumerate}

つまり、双方が互いに相手が利用を希望するアドレスをすんなりと受け入れる
ことができれば、めでたく接続を確立することができますが、
相手が自分の希望を受け付けてくれない場合には何度か交渉を繰り返し、
それでも妥協点が見出せない場合には接続を確立することができないわけです。

本実装では、自分側のアドレス/相手側のアドレスが、あらかじめ定められた
範囲のなかにあるかどうかで、動作を制御することができるようになっています。
つまり、相手が主張あるいは提案したアドレスが、あらかじめ定められた範囲の
なかであればそれを認めますが、範囲外であれば認めずに自分が使用したい
アドレス(あるいは相手に使用させたいアドレス)を主張(提案)し続けます。

自分側で使用したいアドレス、および相手側で使用してもらいたいアドレスは、
set ifaddrコマンドで指定することができます。また、現在の設定は
show ipcpコマンドで確認することができます。

\begin{screen}
  \begin{example}
set ifaddr {\em src-range} {\em dst-range}
  \end{example}
\end{screen}

ここで、{\em src-range}, {\em dst-range}は、自分側/相手側で使用したい
(させたい)アドレスの範囲を表現し、
\begin{quote}
  \begin{verbatim}
ip-address[/mask-width]
  \end{verbatim}
\end{quote}
の形式で指定します。mask-widthは、アドレスの有効範囲を限定するための
ビット長で、0から32までの値をとります。便宜的に、mask-widthが省略
された場合には32が指定されたものと了解されます。

また、ip-addressとして、0.0.0.0が指定された場合には、相手の主張あるいは
提案を無条件に受け付ける効果を持ちます。

\subsubsection*{例 1}
\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> set ifaddr 192.244.176.60 192.244.176.33
ppp> show ipcp
IPCP [Initial]
 his side: 0.0.0.0, 0
 my  side: 0.0.0.0, 0
connected: 0 secs, idle: 0 secs

Defaults:  My Address: 192.244.176.60/32  His Address: 192.244.176.33/32
ppp>
  \end{verbatim}
\end{screen}

\begin{itemize}
  \item 自分側のアドレスとしては、192.244.176.60の利用を主張し、
    それ以外のアドレスは認めない。
  \item 相手側のアドレスとしては192.244.176.33を使用するように
    提案し、それ以外のアドレスは認めない。
\end{itemize}
という意味になります。

\subsubsection*{例 2}
\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> set ifaddr 0 0
IPCP [Initial]
 his side: 0.0.0.0, 0
 my  side: 0.0.0.0, 0
connected: 0 secs, idle: 0 secs

Defaults:  My Address: 0.0.0.0/0  His Address: 0.0.0.0/0
ppp>
  \end{verbatim}
\end{screen}

完全に相手側にアドレスの決定を任せることを指定します。

\subsubsection*{例 3}
\begin{screen}
  \begin{verbatim}
ppp> set ifaddr 192.244.176.60/24 192.244.184.9/29
  \end{verbatim}
\end{screen}

\begin{itemize}
  \item 自分側のアドレスとしては、192.244.176.60の利用を主張するが、
    相手が192.244.176.0から192.244.176.255の範囲のアドレスの使用を
    提案してきた場合には、それを受け入れる。
  \item 相手側の主張するアドレスが、192.244.184.8から192.244.184.15
    の範囲内であれば、それを認める。そうでなければ、192.244.184.9を
    使用するように提案する。
\end{itemize}

\subsubsection*{注意}
mask-widthを省略した場合と、0を指定した場合の意味の違いに注意して
ください。

\begin{itemize}
\item 192.244.184.4という指定は192.244.184.4/32と同義で、
  アドレスが192.244.184.4でなければならないことを指定します。
\item 192.244.184.4/0という指定は、192.244.184.4を使いたいことを
  希望はしますが、相手側が別のアドレスを指定すればそれに従います。
\end{itemize}

\section{ルーティング}
上述したような仕組みにより、リモートのマシンあるいはルータとのアドレスの
調停がおこなわれ接続ができます。しかしながら、これだけではPPPでつながった
そのマシンまでは到達することはできても、その先につながっているネットワーク
にはアクセスすることはできません。なぜなら、PPPの接続の結果つくられる
ルーティングは相手側のアドレスへのホスト・ルートだけで、その先につながって
いるネットワークへのルーティング情報はまだ用意されていないからです。

PPPを使って、自分側のネットワークと相手側のネットワークとを相互に
接続するためには、双方で互いのネットワークに対するルーティングを
用意しなければなりません。RIPのような経路制御プロトコルを使用している
場合には互いにルーティング情報が交換されるのを待っていれば、自動的に
設定をおこなうことができます。そうでなければ、静的にルーティングを
設定してやる必要があります。

自宅のPCをPPPを使って会社や学校のネットワークに接続するような場合には、
自分側はリモートのネットワークのひとつのIPアドレスを使って、ぶらさがる
という使い方が一般的です。そのような場合には、自分以外のアドレスに
到達するため接続の相手先をディフォルト・ゲートウェイとして使用する
ことになりますので、

\begin{screen}
 \begin{verbatim}
# route add default 接続相手のアドレス
 \end{verbatim}
\end{screen}

というコマンドを実行することになります。接続のたびに、このおまじない
を実行するのは面倒ですので、後述するppp.linkupというファイルを用意
しておくことにより、接続後自動的にルーティングを追加することが可能です。

\section{自動モードとルーティング}
自動モードを使って、パケットの送出要求が発生した時に動的にダイアリングを
おこない、接続を確立することができることはすでに説明しました。
しかしながら、リモートのネットワークにパケットを送出するためには、
あらかじめそのネットワークへのルーティングが用意されていなければ
なりません。

\verb|set ifaddr|コマンドを使うことにより、インタフェースで使用する
アドレスを指定することができますが、この時に作成されるルーティング
は接続相手へのホスト・ルーティングだけです。ネットワークへのルーティング
をからかじめ作成しておきたい場合には、\verb|ppp.conf|内でネットワーク
へのルーティングを指定しておきます。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
iijnet:
 set phone 0334569876
 set login "TIMEOUT 5 gin:-\\r-gin: ppp word: ppp"
 set ifaddr 192.244.188.5 192.244.176.50
 add 192.244.176.0 255.255.255.0 192.244.176.50
  \end{verbatim}
\end{screen}

この例のように指定しておけば、192.244.176.50へのパケットが
検出された時だけでなく、ネットワーク192.244.176.0上の任意の
ホストへのパケットが検出された時に自動的に発呼することが
できるようになります。

\section{ルーティングの自動設定}
自動モードを使用した場合には、接続に先立ってインターフェイスが
活性化されていますので、前述のようにインターフェイスを利用する
ルーティングをあらかじめ指定しておくことができます。
しかしながら、自動モード以外では接続が確立した時点ではじめて
インターフェイスが活性化されますので、それまではそのインターフェイス
を利用するルーティングを指定することはできません。

このように、接続が確立してからルーティングを指定する場合には、
\verb|ppp.linkup|でルーティングの指定をしておきます。このファイルでは
接続相手を指定するラベル名やアドレスが指定できますので、接続先に
応じたルーティングの設定をおこなうことが可能です。addコマンドでの
アドレスの指定では、\verb|HISADDR|という文字列は接続先のアドレスを
表現しますので、接続先のアドレスが前もってわかっていなかったり、
動的に変化するような場合にも対応することが可能です。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
iijnet:
 add 192.244.176.0 255.255.255.0 HISADDR
  \end{verbatim}
\end{screen}

\chapter{着信機能の利用}
PPPプログラムを{--direct\/}オプションを指定して使用することにより、
直接モードで動作させることができます。このモードを使うと
着信をサポートすることができます。

\section{着信のための設定}
着信を受け付けるためにはアカウントの作成をはじめとして、
モデムやttyの設定といった作業が必要となります。
ここでは、BSDIをシステムとして利用する場合の具体的な設定例を示します。

\subsection{/etc/gettytab}
モデムが38400bpsをサポートできるのであれば、bidir.19200を参考にして
bidir.38400のエントリを作成します。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
bidir.38400:\
    :bi:ap:hf:tc=38400-baud:
  \end{verbatim}
\end{screen}

\subsection{/etc/ttys}
モデムの接続されているttyでgettyを走らせるように設定します。
設定後、\verb|kill -1 1|を実行しておきます。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
tty00  "/usr/libexec/getty bidir.38400"  dialup on
  \end{verbatim}
\end{screen}

\subsection{アカウントの作成}
まず最初に\verb|/etc/passwd|を編集してPPPでログインするためのアカウントを
作成します。

\begin{screen}
  \begin{verbatim}
ppp:*:21:0:PPP Login:/home/ppp:/usr/local/bin/ppplogin
  \end{verbatim}
\end{screen}

つぎに、PPPのアカウント用のホームディレクトリに\verb|.hushlogin|と
\verb|.ppp.conf|を作成しておきます。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
# cd ~ppp
# touch .hushlogin
# cp /etc/ppp.conf .ppp.conf
# chown ppp .hushlogin .ppp.conf
  \end{verbatim}
\end{screen}

PPPのアカウントでログインした場合には、以下のようなコマンドを実行する
ようにしておいてください。ここの例では\verb|/usr/local/bin/ppplogin|が
以下の内容になるわけです。また、このスクリプトが実行できるように
chmodしておくことも忘れずに。

\begin{screen}
  \begin{verbatim}
/usr/local/bin/ppp -direct
  \end{verbatim}
\end{screen}

ログインに成功して直接モードでのPPPの動作が開始されると、
``Packet mode enabled.''というメッセージが出力されます。
発呼側のシステムでは、このメッセージを確認することにより、
PPPが動作を開始したことを確認することができます。

\subsection{モデム}
モデムを以下のような設定にし、着信ができるようにしてください。

\begin{itemize}
\item フロー制御にはRTS/CTSを使用する
\item リング1回程度で着呼を受け付ける
\item DTRがonからoffになったことを検出し、回線の接続を切断する
\end{itemize}

\section{発信側の設定}
発信側では、着信側の設定に応じてログインができるようにchat scriptを
作成します。パスワードを送信するだけでなく、enabledという文字列を確認する
ところまでスクリプトを用意しておくといいでしょう。

\chapter{フィルタリング機能}\label{filtering}
外のネットワークとの通信を制御するために、フィルタリングの機能が
用意されています。フィルタリング機能では、sourceおよびdestinationに対する
パケットのアドレス、プロトコル、ポート番号を限定することにより
通過するパケットを制限することができます。

フィルタには受信されるパケットに対するもの(ifilter)と送信されるパケットに
対するもの(ofilter)、およびダイアリング動作のトリガとなるパケットを
指定するもの(dfilter)の3種類が用意されています。

\section{指定方法}
フィルタの指定は、パケットの通過を許可/禁止する規則を列挙することに
よりおこないます。実際にパケットを処理する場合には、列挙された順序で
規則との一致を確認します。指定された規則のいずれとも一致しない場合には、
そのパケットの通過は禁止されます。

規則の指定は{\em set ifilter}, {\em set ofilter}, または{\em set dfilter\/}
コマンドを用いておこないます。その書式は次のとおりです。

\begin{quote}
set {\it filter-name\/} {\it rule-no\/} {\it action\/}
\verb|[| {\it src\_addr/src\_width\/} \verb|]
[| {\it dst\_addr/dst\_width\/} \verb|]| \\
\hbox{}\hskip2cm\verb|[| {\it proto\/} \verb+[ src [ lt|eq|gt ]+ {\it port\/}
\verb+]+ \verb+[ dst [ lt|eq|gt ]+ {\it port\/} \verb+[+ estab \verb+]+
\end{quote}

\begin{description}
\item[filter-name] フィルタの名前として、ifilter, ofilterまたはdfilterを
  指定します。
\item[rule-no] 規則の番号を指定します。規則は番号順に一致する
  ものを探し、一致するものが見つかった時点で、その規則で指定されている
  {\it action\/}に従って処理されます。ただし、規則番号0が定義されるまでは
  全ての規則は無効となっており全てのパケットの通過が許可されています。

  規則番号として$-1$を指定すると、対応するフィルタの定義は
  すべてクリアされます。
\item[action] permitまたはdenyを指定することにより、規則と一致した
  時にそのパケットの通過を許可するか禁止するかを指示します。
  clearを指定すると、対応する番号の規則の定義がクリアされます。
\item[src\_addr] パケットのソースアドレスを指定します。
  スラッシュに続いてビット幅が指定された場合には、アドレス指定の
  うちの検査に利用される部分のビット幅であると解釈されます。
\item[dst\_addr]パケットのデスティネーションアドレスを指定します。
  スラッシュに続いてビット幅が指定された場合には、アドレス指定の
  うちの検査に利用される部分のビット幅であると解釈されます。
\item[proto] パケットのプロトコル種別を指定します。
  icmp, udp, tcpのいずれかを指定することができます。
  protoが指定された場合には、以下のようにさらにオプションを指定する
  ことができます。
  \begin{itemize}
  \item icmp src eq {\it icmp-type\/}\hbox{}\\
    指定したタイプのICMPパケットとだけ規則が一致します。
  \item udp src {\it op\/} {\it port\/} dst {\it op\/} {\it value\/}\hbox{}\\
    指定した範囲のソースあるいはデスティネーションのポート番号を
    もつUDPパケットとだけ規則が一致します。演算子{\it op\/}としては、
    eq, lt, gtのいずれかひとつが指定できます。
  \item tcp src {\it op\/} {\it port\/} dst {\it op\/} {\it value\/}
        estab\hbox{}\\
    udpの場合と同じようにポート番号の範囲を指定できます。
    さらに、estabというキーワードが指定されている場合には、すでに
    接続が確立されている場合にだけ、規則が一致します。
  \end{itemize}
\end{description}

\section{設定例}
ここでは、自宅からインターネットワークへアクセスすることを
実際に想定して、フィルタを設定してみましょう。``自分のマシンからは
比較的自由に外のネットワークをアクセスしたいけれども、外のネットワーク
からはアクセスされたくない'' というのは一般的な要望であろうと
思われます。ここでは以下のような条件を想定してみましょう。

\begin{itemize}
\item ICMPパケットをきっかけとしてのダイアリングは禁止する。
\item 外のネットワークへのtelnetアクセスは許可する。
\item 外のネットワークへのftpアクセスは許可する。
\item DNSのパケットの通過は許可する。
\item 自分の会社のネットワーク(この例では192.244.191.0/24)との
 通信は許可する。
\item 他の全てのパケットの通過は禁止する。
\end{itemize}

具体的な設定例は\ref{fig-filter}のようになります。

\begin{figure}[htb]
 \begin{screen}\baselineskip12pt
  \begin{verbatim}
#
# Don't dial with ICMP packet
#
 set dfilter 0 deny icmp
 set dfilter 1 permit 0/0 0/0
#
# Allow ident packet pass through
#
 set ifilter 0 permit tcp dst eq 113
 set ofilter 0 permit tcp src eq 113
#
# Allow telnet connection to the Internet
#
 set ifilter 1 permit tcp src eq 23 estab
 set ofilter 1 permit tcp dst eq 23
#
# Allow ftp access to the Internet
#
 set ifilter 2 permit tcp src eq 21 estab
 set ofilter 2 permit tcp dst eq 21
 set ifilter 3 permit tcp src eq 20 dst gt 1023
 set ofilter 3 permit tcp dst eq 20
#
# Allow access to DNS
#
 set ifilter 4 permit udp src eq 53
 set ofilter 4 permit udp dst eq 53
#
# Allow access from/to my company network
#
 set ifilter 5 permit 192.244.191.0/24 0/0
 set ofilter 5 permit 0/0 192.244.191.0/24
#
# Allow ping and traceroute response
#
 set ifilter 6 permit icmp
 set ofilter 6 permit icmp
 set ifilter 7 permit udp dst gt 33433
  \end{verbatim}
\end{screen}
\caption{フィルタの設定例}\label{fig-filter}
\end{figure}

\begin{itemize}
\item まず、{\em dfilter 0\/}でICMPパケットによるダイアリングを
  禁止します。{\em dfilter 1\/}は、その他のパケットでのダイアリングを
  許可するために必要です。{\tt 0.0}は全てのアドレスとマッチすることに
  注意してください。
\item 113番ポートへのアクセスをするidentパケットを通すようにしておきます。
  この許可がないと、identdを動かしているftpサーバ等へのアクセスに時間が
  かかるようになってしまいます。
\item {\em ifilter 1\/}と{\em ofilter 1\/}はtelnetでのアクセスを
  許可するためのものです。{\em estab\/}を付けることにより、自分側から
  接続要求を出したものだけが受信されることを保証できます。
\item 同様に{\em ifilter 2\/}と{\em ofilter 2\/}でftpでのアクセスを
  許可しますが、これだけではデータの転送ができませんので、{\em ifilter 3\/}
  と{\em ofilter 3\/}を使ってこれを許可します。
\item {\em ifilter 4\/}と{\em ofilter 4\/}は、DNSサーバへの問い合わせを
  可能にします。
\item {\em ifilter 5\/}と{\em ofilter 5\/}で、アドレスを制限することにより、
  自分の会社のネットワークとの間だけで任意のパケットの通信を可能にします。
\item pingやtracerouteにも答えないというのも、考えものなので
  6と7のルールでこれらに答えるようにします。tracerouteでは、検査に
  使用するポート番号がパケットごとに変化しますので、gtを使って範囲を
  指定しています。
\item 上記以外のパケットは規則のいずれとも一致しないので、
  通過を禁止され捨てられることになります、
\end{itemize}

上記のような設定がなされている場合に各フィルタを表示すれば、
次のような表示が得られます。

\begin{screen}\baselineskip12pt
  \begin{example}
ppp> show dfilter
 0 deny   0.0.0.0/0 0.0.0.0/0 icmp
 1 permit 0.0.0.0/0 0.0.0.0/0 
ppp> show ifilter
 0 permit 0.0.0.0/0 0.0.0.0/0 tcp dst eq 113
 1 permit 0.0.0.0/0 0.0.0.0/0 tcp src eq 23 estab
 2 permit 0.0.0.0/0 0.0.0.0/0 tcp src eq 21 estab
 3 permit 0.0.0.0/0 0.0.0.0/0 tcp src eq 20 dst gt 1023
 4 permit 0.0.0.0/0 0.0.0.0/0 udp src eq 53
 5 permit 192.244.191.0/24 0.0.0.0/0 
 6 permit 0.0.0.0/0 0.0.0.0/0 icmp
ppp> show ofilter
 0 permit 0.0.0.0/0 0.0.0.0/0 tcp src eq 113
 1 permit 0.0.0.0/0 0.0.0.0/0 tcp dst eq 23
 2 permit 0.0.0.0/0 0.0.0.0/0 tcp dst eq 21
 3 permit 0.0.0.0/0 0.0.0.0/0 tcp dst eq 20
 4 permit 0.0.0.0/0 0.0.0.0/0 udp dst eq 53
 5 permit 0.0.0.0/0 192.244.191.0/24 
 6 permit 0.0.0.0/0 0.0.0.0/0 icmp
 6 permit 0.0.0.0/0 0.0.0.0/0 udp dst gt 33433
ppp>
  \end{example}
\end{screen}

\section{注意事項}
\begin{itemize}
\item フィルタリングができるのは、PPPで接続したホストとの間で
  交換されるパケットだけです。ethernetあるいはその他のネットワークで
  接続したホストとの間で 通信されるパケットの制御はできません。
\item フィルタリングの指定をする規則の最大数は、ifilter, ofilter
  ともに20となっています。
\item サポートされているプロトコル(ICMP, UDP, TCP)以外のプロトコルが
  検出された場合には、アドレスの指定によって通過が許可されて
  いない限り、そのパケットの通過は禁止されます。
\end{itemize}

% Local Variables: 
% mode: japanese-LaTeX
% TeX-master: "guide"
% End: 
